package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

// 值传递
func persion(ctx context.Context) {
	named := ctx.Value("name")
	fmt.Println(named)
}
func getName() string {
	return "xiaole"
}

// 主动取消（截至时间版本）
func httpCancle(ctx context.Context, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 0; i < 10; i++ {
		select {
		case <-ctx.Done():
			fmt.Println("任务被取消，正在清理...")
			return
		default:
			fmt.Printf("正在执行第 %d/10 个文件...\n", i)
			time.Sleep(1 * time.Second)
		}
	}
}

func main() {
	// 值传递
	ctx := context.WithValue(context.Background(), "name", getName())
	persion(ctx)
	//截止时间
	ctx1, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*2))
	defer cancel()

	//超时时间
	ctx3, _ := context.WithTimeout(context.Background(), time.Second*5)
	// defer cancel3()

	var wg sync.WaitGroup
	// 启动第一个任务
	wg.Add(1)
	go httpCancle(ctx1, &wg)

	// 启动第二个任务
	wg.Add(1)
	go httpCancle(ctx3, &wg)

	wg.Wait()
	fmt.Println("所有任务完成")
}
